package com.zmt.content.service.impl;

import com.zmt.content.dto.CourseCategoryTreeDto;
import com.zmt.content.mapper.CourseCategoryMapper;
import com.zmt.content.po.CourseCategory;
import com.zmt.content.service.CourseCategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class CourseCategoryServiceImpl implements CourseCategoryService {

    @Autowired
    private CourseCategoryMapper courseCategoryMapper;

    @Override
    public List<CourseCategoryTreeDto> queryTreeNodes(String id) {
        List<CourseCategoryTreeDto> courseCategoryTreeDtos = courseCategoryMapper.selectTreeNodes(id);
        //转化为Map集合先？目的是为了方便取出结点信息？
        //map里面存放的是所有父结点不是根节点的结点信息
        Map<String, CourseCategoryTreeDto> map = courseCategoryTreeDtos.stream()
                .filter(courseCategoryTreeDto -> !courseCategoryTreeDto.getId().equals(id))//排除根节点？
                .collect(Collectors.toMap(CourseCategory::getId, courseCategoryTreeDto -> courseCategoryTreeDto, (k1, k2) -> k1));

        //定义一个List作为最终返回的list
        List<CourseCategoryTreeDto> resultList = new ArrayList<>();

        courseCategoryTreeDtos.stream().filter(courseCategoryTreeDto -> !courseCategoryTreeDto.getId().equals(id))
                .forEach(courseCategoryTreeDto -> {
                    if (courseCategoryTreeDto.getParentid().equals(id)) {
                        //说明是根节点的子节点？
                        resultList.add(courseCategoryTreeDto);
                    }
                    //这里拿到的是当前结点的父结点。
                    CourseCategoryTreeDto item = map.get(courseCategoryTreeDto.getParentid());
                    //如果父节点是根节点的话，map中已经过滤掉了，所以直接返回即可，
                    if (item != null) {
                        //如果当前结点的子节点信息还没添加，那就创建一个null
                        if (item.getChildrenTreeNodes() == null) {
                            //如果拿到的结点的子节点信息为空，那么需要创建一个空，后续需要往这里面存列表
                            item.setChildrenTreeNodes(new ArrayList<CourseCategoryTreeDto>());
                        }
                        item.getChildrenTreeNodes().add(courseCategoryTreeDto);
                    }
                });

        return resultList;
    }
}
